﻿// Inner Fire 游戏引擎库
// Contact - 碰撞点
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 用于记录碰撞发生后的碰撞点信息。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-02

#pragma once

#include <game/physics/rigid_body.h>
#include <game/physics/collider.h>

namespace ifire::game {

struct Contact {
  // 对象A
  RigidBody* a;
  // 对象B
  RigidBody* b;

  // 开始的接触点。即在对象A中，B的刚体最外部离A的中心最近的一点。
  IVec3 start;
  // 结束的接触点。即在对象B中，A的刚体最外部离B的中心最近的一点。
  IVec3 end;

  // 法线总是从“A”到“B”。必须保持这个顺序。
  IVec3 normal;
  // 这个碰撞的穿透距离。
  float depth;

  // 使用投影解决这个碰撞
  void ResolvePenetration(float percent = 1.0f);

  // 使用Impulse解决这个碰撞。
  void ResolveImpulse();

  // 使用带有方向的Impulse解决这个碰撞
  void ResolveImpulseRotation();
};

} // namespace ifire::game